# -*- coding:utf-8 -*-
"""
@Author : 审心
@Time : 2023/3/29 13:37
线程相关工具
"""
import inspect
import threading
import time
from functools import wraps
from common.logger.log import log_
from common.utils.MethodUtil import get_func_params_to_dict


class StopAbelThread(threading.Thread):
    """
    可暂停的线程
    """

    def __init__(self, target_fuc, params: dict, is_loop: bool, interval: int = 0):
        """
        :param target_fuc: 目标方法
        :param is_loop: 是否循环执行
        :param interval: 循环间隔
        :param params: 参数映射 key:参数名 value:参数值
        """
        threading.Thread.__init__(self)
        self.target = target_fuc
        self.is_loop = is_loop
        self.interval = interval
        self.params = params
        self._stop_event = threading.Event()

    def run(self) -> None:
        if self.is_loop:
            while not self._stop_event.is_set():
                self.target(params=self.params)
                time.sleep(self.interval)
            log_.info("线程已被关闭")
        else:
            self.target(params=self.params)

    def stop(self):
        self._stop_event.set()


def before_enable_stop_abel_thread(target_func: callable, is_loop: bool, interval: int = 0):
    """
    该方法为一个装饰器 : 在一个方法执行之前 用多线程启动 目标方法
    被该装饰器修饰的方法如果需要获取参数请编写两个
    :param target_func: 目标方法
    :param is_loop: 是否循环执行
    :param interval: 循环间隔(秒)
    :return: wrapper
    """

    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            t = StopAbelThread(target_func, get_func_params_to_dict(func, args, kwargs), is_loop, interval)
            t.start()
            try:
                return func(*args, **kwargs)
            finally:
                t.stop()

        return wrapper

    return decorator
